package org.sysdance.aplicativo.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedList;
import org.sysdance.aplicativo.entidade.Funcionario;
import org.sysdance.aplicativo.entidade.Usuario;
import org.sysdance.aplicativo.enums.PermissaoUsuarioEnum;
import org.sysdance.aplicativo.excecao.ConexaoException;
import org.sysdance.aplicativo.excecao.DAOException;
import org.sysdance.aplicativo.integracao.UsuarioIntegracao;
import org.sysdance.aplicativo.util.ConexaoUtil;
import org.sysdance.aplicativo.util.SysDanceUtil;

public class UsuarioDAO implements UsuarioIntegracao{

    @Override
    public void incluirUsuario(final Usuario usuario) throws DAOException {
        final StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO usuario(id_usuario, id_funcionario, login_usuario, senha_usuario, permissao_usuario) ");
        sql.append("VALUES (NEXTVAL('usuario_id_usuario_seq'), ?, ?, ?, ?);");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString(),new String[]{"id_usuario"});
            ps.setInt(1, usuario.getFuncionario().getIdFuncionario());
            ps.setString(2, usuario.getLoginUsuario());
            ps.setString(3, usuario.getSenhaUsuario());
            ps.setInt(4, usuario.getPermissaoUsuario().getValor());
            ps.executeUpdate();
            final ResultSet rs = ps.getGeneratedKeys();
            if(rs.next()){
                usuario.setIdUsuario(rs.getInt(rs.getMetaData().getColumnName(1)));
            }
        } catch (final ConexaoException ex) {
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            throw new DAOException(sqlex.getMessage());
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
    }

    @Override
    public Boolean isExisteLoginUsuario(final String login) {
        final StringBuilder sql = new StringBuilder();
        sql.append("SELECT login_usuario FROM usuario ");
        sql.append("WHERE login_usuario=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setString(1, login);
            final ResultSet rs = ps.executeQuery();
            return rs.next();
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
        return Boolean.FALSE;
    }

    @Override
    public Collection<Usuario> listarUsuariosCadastrados() {
       final StringBuilder sql = new StringBuilder();
        sql.append("SELECT u.id_usuario,u.id_funcionario, u.login_usuario, u.permissao_usuario , u.senha_usuario FROM usuario as u ");
        sql.append("LEFT JOIN funcionario as f on u.id_funcionario = f.id_funcionario ORDER BY u.id_usuario");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            final ResultSet rs = ps.executeQuery();
            final Collection<Usuario> resultado = new LinkedList<Usuario>();
            while(rs.next()){
                final Usuario usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("id_usuario"));
                usuario.setLoginUsuario(rs.getString("login_usuario"));
                usuario.setPermissaoUsuario(PermissaoUsuarioEnum.getEnum(rs.getInt("permissao_usuario")));
                usuario.setFuncionario(new Funcionario());
                usuario.getFuncionario().setIdFuncionario(rs.getInt("id_funcionario"));
                usuario.setSenhaUsuario(rs.getString("senha_usuario"));
                resultado.add(usuario);
            }
            return resultado;
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
        return new LinkedList<Usuario>();
    }
    
    @Override
    public void atualizarDadosUsuario(Usuario usuario) throws DAOException {
    	final StringBuilder sql = new StringBuilder();
        sql.append("UPDATE usuario SET senha_usuario=?, permissao_usuario=? ");
        sql.append("WHERE id_usuario=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setString(1, usuario.getSenhaUsuario());
            ps.setInt(2, usuario.getPermissaoUsuario().getValor());
            ps.setInt(3, usuario.getIdUsuario());
            ps.executeUpdate();
        } catch (final ConexaoException ex) {
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            throw new DAOException(sqlex.getMessage());
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
    }
}
